/*-------------------------------------------------------------------------
 *
 * pg_rusage.c
 *	  资源使用测量支持例程。
 *
 *
 * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 *
 * IDENTIFICATION
 *	  src/backend/utils/misc/pg_rusage.c
 *
 *-------------------------------------------------------------------------
 */
#include "postgres.h"

#include <unistd.h>

#include "utils/pg_rusage.h"


/*
 * 初始化使用快照。
 */
void pg_rusage_init(PGRUsage *fc_ru0)
{
	getrusage(RUSAGE_SELF, &fc_ru0->ru);
	gettimeofday(&fc_ru0->tv, NULL);
}

/*
 * 计算自上次使用快照以来经过的时间，并格式化为
 * 可显示的字符串。结果保存在一个静态字符串中，
 * 这虽然很糟糕，但没有人声称Postgres后端是
 * 可线程化的...
 */
const char * pg_rusage_show(const PGRUsage *fc_ru0)
{
	static char fc_result[100];
	PGRUsage	fc_ru1;

	pg_rusage_init(&fc_ru1);

	if (fc_ru1.tv.tv_usec < fc_ru0->tv.tv_usec)
	{
		fc_ru1.tv.tv_sec--;
		fc_ru1.tv.tv_usec += 1000000;
	}
	if (fc_ru1.ru.ru_stime.tv_usec < fc_ru0->ru.ru_stime.tv_usec)
	{
		fc_ru1.ru.ru_stime.tv_sec--;
		fc_ru1.ru.ru_stime.tv_usec += 1000000;
	}
	if (fc_ru1.ru.ru_utime.tv_usec < fc_ru0->ru.ru_utime.tv_usec)
	{
		fc_ru1.ru.ru_utime.tv_sec--;
		fc_ru1.ru.ru_utime.tv_usec += 1000000;
	}

	snprintf(fc_result, sizeof(fc_result),
			 _("CPU: user: %d.%02d s, system: %d.%02d s, elapsed: %d.%02d s"),
			 (int) (fc_ru1.ru.ru_utime.tv_sec - fc_ru0->ru.ru_utime.tv_sec),
			 (int) (fc_ru1.ru.ru_utime.tv_usec - fc_ru0->ru.ru_utime.tv_usec) / 10000,
			 (int) (fc_ru1.ru.ru_stime.tv_sec - fc_ru0->ru.ru_stime.tv_sec),
			 (int) (fc_ru1.ru.ru_stime.tv_usec - fc_ru0->ru.ru_stime.tv_usec) / 10000,
			 (int) (fc_ru1.tv.tv_sec - fc_ru0->tv.tv_sec),
			 (int) (fc_ru1.tv.tv_usec - fc_ru0->tv.tv_usec) / 10000);

	return fc_result;
}
